package crs.auxiliares.facade;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import crs.auxiliares.beans.JsonJTableOptionsBean;
import crs.auxiliares.dao.CrsProvinciasDao;
import crs.auxiliares.model.CrsProvincias;
import crs.perfiles.facade.PerfilesFacade;
import crs.solicitudes.dao.CrsSolicitudesDao;
import crs.users.dao.UsersDao;
import crs.users.facade.UserFacade;
import crs.users.model.Users;
import crs.web.utilidades.Constantes;


@Component
public class ListasFacadeImpl implements ListasFacade {

	
	@Autowired
	CrsSolicitudesDao crsSolicitudesDao;

	@Autowired
	CrsProvinciasDao crsProvinciasDao;

	
	@Autowired
	UsersDao usersDao;

	
	@Autowired
	UserFacade userFacade;

	@Autowired
	PerfilesFacade perfFacade;

	
	@Override
	public LinkedHashMap<Short, String> obtenerTiposSolAlta(MessageSource resource, Locale locale) {
		LinkedHashMap<Short, String> tiposolalta = new LinkedHashMap<Short, String>();
		tiposolalta.put(Integer.valueOf(Constantes.USER).shortValue(), resource.getMessage("tsa.usuario", null, locale));
		//tiposolalta.put(Integer.valueOf(Constantes.MEDI).shortValue(), resource.getMessage("tsa.medico", null, locale));
		tiposolalta.put(Integer.valueOf(Constantes.CENT).shortValue(), resource.getMessage("tsa.centro", null, locale));
		//tiposolalta.put(Integer.valueOf(Constantes.COME).shortValue(), resource.getMessage("tsa.comercial", null, locale));
		return tiposolalta;
	}
	
	@Override
	public LinkedHashMap<Character, String> obtenerSexos(MessageSource resource, Locale locale) {
		LinkedHashMap<Character, String> sexos = new LinkedHashMap<Character, String>();
		sexos.put('H', resource.getMessage("crs.per.sex_h", null, locale));
		sexos.put('M', resource.getMessage("crs.per.sex_m",null, locale));
		return sexos;
	}

	
	@Override
	public LinkedHashMap<Short, String> obtenerSituaciones(MessageSource resource, Locale locale, String role) {
		LinkedHashMap<Short, String> situaciones = new LinkedHashMap<Short, String>();

		situaciones.put((short) 0, resource.getMessage("est.tot", null, locale));
		situaciones.put(Constantes.SS_EST_INACTIVA, resource.getMessage("est.ina", null, locale));
		situaciones.put(Constantes.SS_EST_ACTIVA, resource.getMessage("est.act", null, locale));
		situaciones.put(Constantes.SS_EST_ERRONEA, resource.getMessage("est.err", null, locale));
		situaciones.put(Constantes.SS_EST_PROCESADA, resource.getMessage("est.pro", null, locale));
		situaciones.put(Constantes.SS_EST_ANULADA, resource.getMessage("est.anu", null, locale));
		situaciones.put(Constantes.SS_EST_ENPROCESO, resource.getMessage("est.enp", null, locale));
		
		return situaciones;
	}

	//clientes del centro para el que trabaja en empleado 
	@SuppressWarnings("unchecked")
	@Override
	@Transactional
	public LinkedHashMap<Integer, String> obtenerClientes( String role, Integer userid) {
		//LinkedHashMap<Integer, String> clientes = new LinkedHashMap<Integer, String>();
		try{
			Users user = userFacade.findById(userid);
			LinkedHashMap<Integer, String> clientes  = new LinkedHashMap<Integer, String>() ;
			
			List<Object[]> rows = usersDao.getUsuariosList(user, role,userid);
			clientes.put((int) 0, "");
		
			String segundoapellido="";
			if (rows!=null){ 
				for (Object[] row : rows) {
					if (row[3]!=null){
						segundoapellido=" " + row[3];
					}else{
						segundoapellido="";
					}
					clientes.put((Integer)row[0], row[1] + " " + row[2] + segundoapellido);
			    }
			}
			return clientes;
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return null;
	}

	@Override
	public LinkedHashMap<Short, String> obtenerEstados(List<JsonJTableOptionsBean> lista) {
		LinkedHashMap<Short, String> tiposolalta = new LinkedHashMap<Short, String>();
		//for (int i=0;i<lista.size();i++){
		for (JsonJTableOptionsBean bean:lista){
			tiposolalta.put(Short.valueOf(bean.getValue()), bean.getDisplayText());
		}
		return tiposolalta;
	}

	@Override
	public LinkedHashMap<Short, String> obtenerEstadoCorreo(
			MessageSource resource, Locale locale) {
			LinkedHashMap<Short, String> estado = new LinkedHashMap<Short, String>();
			
			estado.put((short) 0, resource.getMessage("est.tot", null, locale));
			estado.put(Constantes.EMAIL_ABIERTO, resource.getMessage("men.lei", null, locale));
			estado.put(Constantes.EMAIL_CERRADO, resource.getMessage("men.no.lei", null, locale));
			estado.put(Constantes.EMAIL_ENVIADO, resource.getMessage("men.env", null, locale));
			estado.put(Constantes.EMAIL_RECIBIDO, resource.getMessage("men.rec", null, locale));
			return estado;
			
	}

	@Override
	@Transactional
	public LinkedHashMap<Integer, String> correoCC(String role,
			Integer userid) {
		try{
			Users user = userFacade.findById(userid);
			LinkedHashMap<Integer, String> clientes  = new LinkedHashMap<Integer, String>() ;
			Set<Users> rows = null;
			if (role.equals(Constantes.ROLE_USER)){
				rows = crsSolicitudesDao.centrosPropDeSolicitudesPocesadasOEnproc(userid);
			}else if(role.equals(Constantes.ROLE_MEDI)){
				rows = crsSolicitudesDao.usuariosMensajeados(userid);
			}
			
			clientes.put((int) 0, "");
		
			String apellido1 = "";
			String apellido2 = "";
			if (rows!=null){ 
				for (Users row : rows) {
					if (row.getApellido1()!=null){
						apellido1 = row.getApellido1();
					}
					if (row.getApellido2()!=null){
						apellido2 = row.getApellido2();
					}
					
					clientes.put(row.getUserid(), row.getNombre() + apellido1+ " " + apellido2);
			    }
			}
			return clientes;
		}catch(Exception e){
			e.printStackTrace();
		}
	
	return null;
	}

	@Override
	public List<CrsProvincias> obtenerProvincias(MessageSource resource, Locale locale) {
		
		List<CrsProvincias> lprov = crsProvinciasDao.cargarProvincias(locale);
		return lprov;
		
	}
	
	
	
	
}
